#include "database.h"
#include "log.h"


// 打开数据库
sqlite3 *creat_database(char *name)
{
    // 创建 或 打开指定数据库
    int data = -1;      // 数据库创建 返回值
    sqlite3 *db = NULL; // 数据库指针
    // 创建数据库函数
    data = sqlite3_open(name, &db);
    if (data != SQLITE_OK)
    {
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return NULL;
    }
    DEBUG("数据库创建成功\n");
    return db;
}
// 关闭数据库
void close_sql(sqlite3 *db )
{
    sqlite3_close(db); // 关闭数据库
}
// 执行数据库
void exec_sql(sqlite3 *db, char *sql)
{
    char *pmsg = NULL;
    sqlite3_exec(db, sql, 0, 0, &pmsg);
    if (pmsg != NULL)
    {
        ERROR("错误信息是%s\n", pmsg);
    }
    else
    {
        DEBUG("语句执行成功\n");
    }
}
// 查找数据库
RET database_query(sqlite3 *db, char *sql)
{
    
    char *msg = 0;
    RET ret;
    sqlite3_get_table(db, sql, &ret.result, &ret.row, &ret.col, &msg);

    if (msg != NULL)
    {
        ERROR("查询数据库出错了：%s\n", msg);
        sqlite3_free_table(ret.result); // 释放内存
        ret.result = NULL;
        ret.row = -1;
        ret.col = -1;
        return ret; // 返回错误状态
    }
        DEBUG("准备返回查询结构了\n");
        return ret;
        // printf("查询数据库成功！一共有%d行 %d列\n",row,column);
        // for (size_t i = 4; i < row*column+4; )
        // {
        //      printf("%s %s %s %s\n",Result[i],Result[i+1],Result[i+2],Result[i+3]);
        //      i+=4;
        // }

        // printf("%s %s %s %s\n",Result[0],Result[1],Result[2],Result[3]);
        // printf("%s %s %s %s\n",Result[4],Result[5],Result[6],Result[7]);
        // printf("%s %s %s %s\n",Result[8],Result[9],Result[10],Result[11]);
    
}

// 打印数据库返回值结果
void printdatabase(RET ret){
    DEBUG("查询数据库成功 一共有%d行 %d列\n ",ret.row,ret.col);
    //printf("准备打印数据-------------\n");
    if (ret.result == NULL || ret.row < 0 || ret.col < 0) {
        DEBUG("无效的查询结果\n");
        return;
    }
    // 打印表头
    /* for (int j = 0; j < ret.col; j++) {
        printf("%s\t", ret.result[j]);
    }
    printf("\n"); */            
    //打印数据
    DEBUG("准备打印数据 ");
    int data_start_index = ret.col;
    for(int i = 0 ;i<ret.row ;i++){
        for(int j=0;j<ret.col ; j++){
            DEBUG("%s %d ",ret.result[data_start_index + i * ret.col + j] , data_start_index + i * ret.col + j);
        }
        DEBUG("\n");
     }
     DEBUG("打印结束-----\n");
}

// 打印数据库返回值结果 表头
void printdatabase_headtab(RET ret){
    DEBUG("查询数据库成功 一共有%d行 %d列\n ",ret.row,ret.col);
    //printf("准备打印数据-------------\n");
    if (ret.result == NULL || ret.row < 0 || ret.col < 0) {
        DEBUG("无效的查询结果\n");
        return;
    }
    // 打印表头
    printf("打印表头\n");
    for (int j = 0; j < ret.col; j++) {
        printf("%s\t", ret.result[j]);
    }
    printf("\n");            
    /* //打印数据
    DEBUG("准备打印数据 ");
    int data_start_index = ret.col;
    for(int i = 0 ;i<ret.row ;i++){
        for(int j=0;j<ret.col ; j++){
            DEBUG("%s %d ",ret.result[data_start_index + i * ret.col + j] , data_start_index + i * ret.col + j);
        }
        DEBUG("\n");
     } */
     DEBUG("打印结束-----\n");
}

//清空  用户名 绑定的 fd 
void clear_all_fds(sqlite3 *db) {
    // 清空 users 表中的 user_fd
    exec_sql(db, "UPDATE people SET user_fd = 'off_line', updata_time = 0;");
    
    // 清空 merchants 表中的 merchant_fd
    exec_sql(db, "UPDATE merchant SET merchant_fd = 'off_line', updata_time = 0;");
}

//在 用户 或者 商家 退出时  更新 套接字状态
void return_fd_state(int fd){
    //先判断是不是用户表中的 fd 是就更新为 ‘off_line’
    //如果不是 用户表中的 就 找 商家表 更新为 ‘off_line’

    char querySql[256];
    int affectedRows;

    // 尝试在 people 表中查找并更新
    snprintf(querySql, sizeof(querySql),
             "UPDATE people SET user_fd='off_line' WHERE user_fd='%d';", fd);
    exec_sql(db, querySql);
    affectedRows = sqlite3_changes(db);

    if (affectedRows > 0) {
        DEBUG("已成功更新用户表中的套接字状态。\n");
    } else {
        // 如果未找到匹配项，则尝试在 merchant 表中查找并更新
        snprintf(querySql, sizeof(querySql),
                 "UPDATE merchant SET merchant_fd='off_line' WHERE merchant_fd='%d';", fd);
        exec_sql(db, querySql);
        affectedRows = sqlite3_changes(db);

        if (affectedRows > 0) {
            DEBUG("已成功更新商家表中的套接字状态。\n");
        } else {
            DEBUG("未找到对应的用户或商家记录进行更新。\n");
        }
    }

    

    DEBUG("登出状态更新完成。\n");
}


